/*
 * @Description  : Date
 * @Autor        : 杜康
 * @Date         : 2021-08-14 07:57:06 +0800
 * @LastEditors  : 杜康
 * @LastEditTime : 2021-08-14 11:12:36 +0800
 */

/**
 * @description: 时区转换 返回时间戳
 * @param {*} time
 * @param {*} offset
 * @return {*}
 * @author: 杜康
 * @Date: 2021-08-14 07:57:56 +0800
 */
const timeZoneConversion = (time, offset) => {
    let d = new Date(time); //创建一个Date对象 time时间 offset 时区  中国为  8
    let localTime = d.getTime();
    let localOffset = d.getTimezoneOffset() * 60000; //获得当地时间偏移的毫秒数
    let utc = localTime + localOffset; //utc即GMT时间
    let wishTime = utc + 3600000 * offset;
    return wishTime;
}

/**
 * @description: 友好时间显示：
  1分钟以内显示为：刚刚
  1小时以内显示为：N分钟前
  当天以内显示为：今天 N点N分（如：今天 22:33）
  昨天时间显示为：昨天 N点N分（如：昨天 10:15）
  当年以内显示为：N月N日 N点N分（如：02月03日 09:33）
  今年以前显示为：N年N月N日 N点N分（如：2000年09月18日 15:59）
 * @param {*} time
 * @return {*}
 * @author: 杜康
 * @Date: 2021-08-14 07:58:58 +0800
 */  
const formatTimeFriendly = (time) => {
    let tmDate = new Date(time);
    let timestamp = tmDate.getTime();
    const zeroize = (num) => {
        return (String(num).length == 1 ? "0" : "") + num;
    }
    let curDate = new Date();
    let curTimestamp = curDate.getTime(); //当前时间戳
    let timestampDiff = curTimestamp - timestamp; // 参数时间戳与当前时间戳相差秒数

    let Y = tmDate.getFullYear(),
        m = tmDate.getMonth() + 1,
        d = tmDate.getDate();
    let H = tmDate.getHours(),
        i = tmDate.getMinutes();
    // s = tmDate.getSeconds();

    if (timestampDiff < 60) {
        // 一分钟以内
        return "刚刚";
    } else if (timestampDiff < 3600) {
        // 一小时前之内
        return Math.floor(timestampDiff / 60) + "分钟前";
    } else if (
        curDate.getFullYear() == Y &&
        curDate.getMonth() + 1 == m &&
        curDate.getDate() == d
    ) {
        return `今天${zeroize(H)}:${zeroize(i)}`;
    } else {
        let newDate = new Date((curTimestamp - 86400) * 1000); // 参数中的时间戳加一天转换成的日期对象
        if (
            newDate.getFullYear() == Y &&
            newDate.getMonth() + 1 == m &&
            newDate.getDate() == d
        ) {
            return `昨天 ${zeroize(H)}:${zeroize(i)}`;
        } else if (curDate.getFullYear() == Y) {
            return (`${zeroize(m)}月${zeroize(d)}日 ${zeroize(H)}:${zeroize(i)}`);
        } else {
            return (`${Y}年${zeroize(m)}月${zeroize(d)}日 ${zeroize(H)}:${zeroize(i)}`);
        }
    }
}

/**
 * @description: 格式化距现在的已过时间
 * @param { Date } startTime
 * @return { String }
 * @author: 杜康
 * @Date: 2021-08-14 08:04:37 +0800
 */
const formatPassTime = (startTime) => {
    let currentTime = Date.parse(new Date()),
        time = currentTime - startTime,
        day = parseInt(time / (1000 * 60 * 60 * 24)),
        hour = parseInt(time / (1000 * 60 * 60)),
        min = parseInt(time / (1000 * 60)),
        month = parseInt(day / 30),
        year = parseInt(month / 12);
    if (year) return year + "年前";
    if (month) return month + "个月前";
    if (day) return day + "天前";
    if (hour) return hour + "小时前";
    if (min) return min + "分钟前";
    else return "刚刚";
}

/**
 * @description: 格式化时间 为 mysql timestamp 类型时间
 * @param {*} time
 * @return {*}
 * @author: 杜康
 * @Date: 2021-08-14 08:05:20 +0800
 */
const formatTimestamp = (time) => {
    let d = time ? new Date(time) : new Date();
    let yy = d.getFullYear();
    let mm =
        d.getMonth() + 1 < 10 ? "0" + (d.getMonth() + 1) : d.getMonth() + 1;
    let dd = d.getDate();
    let hh = d.getHours() < 10 ? "0" + d.getHours() : d.getHours();
    let mf = d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes();
    let ss = d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds();
    let timestamp = `${yy}-${mm}-${dd} ${hh}:${mf}:${ss}`;
    return timestamp;
}

/**
 * @description: 格式化现在距结束的剩余时间
 * @param { Date } endTime
 * @return { String }
 * @author: 杜康
 * @Date: 2021-08-14 08:05:56 +0800
 */
const formatRemainTime = (endTime) => {
    let startDate = new Date(); //开始时间
    let endDate = new Date(endTime); //结束时间
    let t = endDate.getTime() - startDate.getTime(); //时间差
    let d = 0,
        h = 0,
        m = 0,
        s = 0;
    if (t >= 0) {
        d = Math.floor(t / 1000 / 3600 / 24);
        h = Math.floor((t / 1000 / 60 / 60) % 24);
        m = Math.floor((t / 1000 / 60) % 60);
        s = Math.floor((t / 1000) % 60);
    }
    return d + "天 " + h + "小时 " + m + "分钟 " + s + "秒";
}

/**
 * @description: 是否为闰年
 * @param { Number } year
 * @return { Boolean }
 * @author: 杜康
 * @Date: 2021-08-14 08:07:01 +0800
 */
const isLeapYear = (year) => {
    if (0 === year % 4 && (year % 100 !== 0 || year % 400 === 0)) {
        return true;
    }
    return false;
}

/**
 * @description: 判断是否为同一天
 * @param { Date } date1
 * @param { Date } date2 可选／默认值：当天
 * @return { Boolean }
 * @author: 杜康
 * @Date: 2021-08-14 08:07:39 +0800
 */
const isSameDay = (date1, date2) => {
    if (!date2) {
        date2 = new Date();
    }
    let date1_year = date1.getFullYear(),
        date1_month = date1.getMonth() + 1,
        date1_date = date1.getDate();
    let date2_year = date2.getFullYear(),
        date2_month = date2.getMonth() + 1,
        date2_date = date2.getDate();

    return (
        date1_date === date2_date &&
        date1_month === date2_month &&
        date1_year === date2_year
    );
}

/**
 * @description: 获取指定日期月份的总天数
 * @param { Date } time
 * @return { Number }
 * @author: 杜康
 * @Date: 2021-08-14 08:08:29 +0800
 */
const getMonthDays = (time) => {
    time = new Date(time);
    let year = time.getFullYear();
    let month = time.getMonth() + 1;
    return new Date(year, month, 0).getDate();
}

export default {
    timeZoneConversion,
    formatTimeFriendly,
    formatPassTime,
    formatTimestamp,
    formatRemainTime,
    isLeapYear,
    isSameDay,
    getMonthDays,
};
